/* Zatok - язык программирования текстовых игр
 * (С) 2010 - 2012 Меркулов Матвей Юрьевич
 * Код лицензирован под лицензией GNU LGPL
 * Вы можете прочитать текст лицензии по адресу:
 * http://www.gnu.org/copyleft/lesser.html
 * или прочитать русский перевод по адресу:
 * http://ru.wikisource.org/wiki/GNU_Lesser_General_Public_License
 */

package base.context;

import base.CObject;
import base.CProject;
import base.CGUI;
import base.module.CModule;
import base.value.userobject.CUserObject;
import base.value.CYes;
import java.util.LinkedList;
import parser.CParser;

public class CCommand extends CModule {
	public CObject Name;
	public CObject Condition;
	public CUserObject Parent;
	public LinkedList<CModule> Modules = new LinkedList<CModule>();


	
	@Override
	public CObject Parse( LinkedList<String> Tokens ) {
		if ( CProject.CurrentObject == null ) CParser.Error( "Блок команды вне объекта" );
		if ( CProject.CurrentObject.BaseData == null ) CParser.Error( "Блок команды в клоне объекта" );
		if ( CParser.CurrentFunction != null ) CParser.Error( "Блок команды в блоке функции" );
		if ( CParser.CurrentCommand != null ) CParser.Error( "Вложенная команда" );
		
		SetFilePosition();

		boolean If = false;
		LinkedList<String> NameTokens = new LinkedList<String>();
		LinkedList<String> ConditionTokens = new LinkedList<String>();
		for ( String Token : Tokens ) {
			if ( Token.equals( "команда" ) ) continue;
			if ( Token.equals( "если" ) ) {
				If = true;
			} else {
				if ( If ) {
					ConditionTokens.add( Token );
				} else {
					NameTokens.add( Token );
				}
			}
		}

		Name = CParser.ParseFunction( NameTokens );
		if ( !ConditionTokens.isEmpty() ) {
			Condition = CParser.ParseFunction( ConditionTokens );
		} else {
			Condition = new CYes();
		}
		Parent = CProject.CurrentObject;
		SetFilePosition();

		CProject.CurrentObject.BaseData.Commands.add( this );

		CParser.CurrentCommand = this;
		ParseModules( Modules, "команд", "КонецКоманды" );
		CParser.CurrentCommand = null;
		return null;
	}


	
	@Override
	public void Execute() {
		if( !CGUI.InformationWindow.Gadgets.isEmpty() ) CGUI.InformationWindow.AddLineBreak();
		CGUI.InformationWindow.AddText( "> " + CProject.SelectedGadget.Choice.Name );
		CGUI.InformationWindow.AddLineBreak();

		CUserObject OldCurrentObject = CProject.CurrentObject;
		CProject.CurrentObject = Parent;
		CContext OldCurrentContext = CProject.CurrentContext;
		CProject.CurrentContext = new CContext();

		ExecuteModulesList( Modules );

		CProject.CurrentContext = OldCurrentContext;
		CProject.CurrentObject = OldCurrentObject;
	}
	
	
	
	@Override
	public String toString() {
		return Name.ToString();
	}
	
	

	public boolean EqualToOneOf( LinkedList<CCommand> Commands ) {
		for( CCommand Command : Commands ) {
			if( Command.Name.equals( Name ) ) return true;
		}
		return false;
	}
}
